首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏用户4352451的专栏

    B+

    三、B+ B+是B-变体,也是一种多路搜索,其定义基本与B相同,除了: 非叶子结点子树指针与关键字个数相同; 非叶子结点子树指针P[i],指向关键字值属于[K[i], K[i+1 四、BB+对比 B和B+区别在于,B+非叶子结点只包含导航信息,不包含实际值,所有的叶子结点和相连节点使用链表相连,便于区间查找和遍历。 2、B+优点 由于B+在内部节点上不好含数据信息,因此在内存页中能够存放更多key。 数据存放更加紧密,具有更好空间局部性。 因此访问叶子几点上关联数据也具有更好缓存命中率; B+叶子结点都是相链,因此对整棵便利只需要一次线性遍历叶子结点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。 而B则需要进行每一层递归遍历。相邻元素可能在内存中不相邻,所以缓存命中性没有B+好。 3、应用 BB+经常被用于数据库中,作为MySQL数据库索引。

    71120发布于 2020-08-26
  • 来自专栏IT当时语_青山师_JAVA技术栈

    BB+区别及MySQL为何选择B+

    BB+区别及MySQL为何选择B+ 1. BB+定义 BB+都是一种多路搜索,常用于数据库和文件系统中进行索引操作。在介绍BB+区别之前,先来了解一下它们定义。 B+ B+也是一种多路搜索,与B相似,但在B+中,所有的数据都存储在叶子节点中,而非在非叶子节点中。B+满足以下条件: 所有关键字都出现在叶子节点链表中,且链表中关键字恰好是有序。 所有的非叶子节点可以看做是索引部分,节点中仅包含子树中最大(或最小)关键字。 2. BB+区别 BB+虽然都是多路搜索,但它们区别还是比较明显。 查询性能 B+查询性能更优,因为B+数据都存储在叶子节点中,而B数据既可能存储在非叶子节点中,也可能存储在叶子节点中。 B+叶子节点之间通过指针连接起来,形成一个有序链表,方便范围查询和排序操作。 B+非叶子节点中只包含索引,因此占用空间更小,可以存储更多索引信息。

    2.2K10编辑于 2023-05-05
  • 来自专栏烟草的香味

    B+,索引

    引言 时隔一年,我又想起当初看数据库时,看到B+,就是数据库索引使用数据结构。再整理一下,看看自己没有忘记很多吧。 概述 B+之前,先来看一下二叉查找(1,2,3,4,5,6,7) ? 但想想数据库查找数据场景: select * from user where id > 10, 显然,对于这种查找区间来说,二叉查找并不高效。那么B+是如何解决这个问题呢? 没错,这就是B+。 这个结构是怎么想出来我不知道啊,但是我今天突然发现,他存储方式和跳表十分之像啊。莫非是受到了跳表启发?亦或是跳表受到了B+启发?咱也不知道。 引申 很好,B+整明白了,新问题出现了。如果数据库使用这种数据结构存储,全部放到内存中肯定是不现实,势必要将其存储到硬盘中,待查找时再到文件中读取。 B+是不是分叉越多越好 那肯定不是越多越好啊,要是一层就把所有数据都存储了,要他还有什么用,根本没有起到快速定位作用。 但我想说并不是这。

    1.2K20发布于 2019-12-02
  • 来自专栏面试

    B+结构

    阶数与节点容量B+阶数m决定了节点子节点数量和键值容量,通常与磁盘页大小对齐以优化I/O 非根节点:键值数范围:⌈m/2⌉−1≤k≤m−1⌈m/2⌉−1≤k≤m−1(如3阶B+,非根节点最多2个键值 关键结构特性数据与索引分离:内部节点仅存索引键,叶子节点存数据或指针,使得内部节点更紧凑,单个节点可容纳更多键值,降低高度 高度平衡:所有叶子节点位于同一层级,查询路径长度一致,保证稳定时间复杂度( 与B区别B+在以下方面区别于B 数据存储位置:B内部节点存数据,B+仅叶子节点存数据。链表结构:B+树叶子节点通过链表连接,B无此设计。 而对于高度为3B+(21902400 条数据)就可以存放 1170 x 1170 x 16 = 21902400 条数据(两千多万条数据),也就是对于两千多万条数据,为什么索引结构默认使用B+, B-Tree,叶子节点和非叶子节点都保存数据,相同数据量,B+更矮壮,也是就说,相同数据量,B+数据结构,查询磁盘次数会更少。

    82610编辑于 2025-03-18
  • 来自专栏码农知识点

    浅谈树形结构特性和应用(上):多叉,红黑,堆,Trie,BB+...

    红黑(Red–black tree)是应用很广泛一种平衡,是面试官装X利器。我们来看一下它保证平衡性一些特性: 节点是红色或黑色。 根是黑色。 所有叶子都是黑色(叶子是NIL节点)。 这些约束确保了红黑关键特性:从根到叶子最长路径不多于最短路径两倍长(根据性质4和性质5)。从而整棵高度比较稳定,相应增、删、改、查操作效率较高较稳定,而不同于普通二叉查找。 堆 堆是一种特殊数据结构,它满足两个特性: 堆是一个完全二叉; 堆中每一个节点排序值都必须大于等于(或小于等于)其左右子节点排序值。 这里解释以下完全二叉。 B vs B+ 看图说话,BB+显著不同地方是: 1.B非叶子节点即是索引,也是数据;B+非叶子节点仅是索引,数据全部存储在叶子节点。 2.B+树叶子节点数据之间是用链表链接。 这会导致: B+相比B: 1.数据连续性: B+树叶子节点上一页存储数据是连续,当需要一个结点上数据时,B+可以增大缓存命中率。

    5.1K30发布于 2020-07-30
  • 来自专栏宇宙之_一粟

    BB+

    BB+都是用于外查找数据结构,都是平衡多路查找。 两者区别 在B+中,具有n个关键字结点含有n棵子树,即每个关键字对应一颗子树;而在B中,具有n个关键字结点含有(n+1)棵子树。 在B+中,除根节点外,每个结点中关键字个数n取值范围是[m/2]~m,根节点n取值范围是2~m;而在B中,除根节点外,其他所有非叶结点关键字个数n取值范围是[m/2]-1~m-1,根节点n B+所有叶结点包含了全部关键字,即其他非叶结点中关键字包含在叶结点中;而在B中,关键字是不重复B+所有非叶结点仅起到索引作用,即结点中每个索引项只含有对应子树最大关键字和指向该子树指针,不包含该关键字对应记录存储地址;而在B中,每个关键字对应一个记录存储地址。 通常在B+树上有两个头指针,一个指向根节点,另一个指向关键字最小叶结点,所有叶结点链接成一个不定长线性链表,所以B+可以进行随机查找和顺序查找;而B只能进行随机查找。

    1.2K41发布于 2020-10-26
  • 来自专栏leetcode_solutions

    BB+区别

    B+叶节点是链接,所以对所有对象进行全扫描只需要一次线性遍历所有叶节点。另一方面,B需要遍历每一层。这种全遍历可能会涉及比B+线性遍历更多高速缓存未命中。 B+叶子节点由一条链相连,而B叶子节点各自独立。 使用B+好处 由于B+内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多键,有利于更快地缩小查找范围。 这种特性使得B在特定数据重复多次查询场景中更加高效。 针对以上两个问题,B+诞生了,B+相比B,本质上是一样,区别就在与B+所有根节点都不带有任何数据信息,只有索引信息,所有数据信息全部存储在叶子节点里,这样,整个每个节点所占内存空间就变小了 不仅如此,B+还有一个相应优质特性,就是B+查询效率是非常稳定,因为所有信息都存储在了叶子节点里面,从根节点到所有叶子节点路径是相同

    5K41发布于 2019-03-14
  • 来自专栏CSDN搜“看,未来”

    浅谈 B+

    目前常见主要三种存储引擎是:哈希、B+、LSM。LSM下次再说,hash讲过了。 没有什么B-,那是 B-tree,国内一直翻译成B-,其实就是B。 B我也不想说了,因为已经被升级过了,叫B+。 下图来自 小灰算法之旅,懂得人自然就懂了: ---- 对比一下B: 这个是B。 ---- B+对于B改进 1、所有数据都在叶子节点。算法更容易理解了。回头抽空手写一下B+,正好跳表也要重写了。 2、底层叶子节点使用链表串起来了。 这第二个改进不可谓不秀。 单这么看自然是不明所以,但是凡事都要放在上下文中去看,B+上下文对应就是磁盘IO索引呐,那如果我要范围查询呢?比如说我要上面里面 4-10 所有数据,B 怎么作为?B+怎么作为? ---- 代码实现 先占个位置,这几天是没办法了,有更重要事情安排上了。忙完这两周,十月说什么也要安排上。

    52920发布于 2021-10-09
  • 来自专栏java达人

    LSMB+比较

    那么,为了使读取性能尽可能高,磁盘中数据必须是有序。这就是B+原理,但是写起来就很糟糕,因为会产生大量随机IO,磁盘寻道速度跟不上。 关于b B+最大性能问题是会产生大量随机io。 新插入数据存储在磁盘上,会产生大量随机写IO。 例如,Oracle 常用索引使用 B+ 。下面是一个B+例子 根节点和分支节点很简单,记录每个叶子节点最小值,用指针指向叶子节点。 关于lsm LSM 本质上是读写之间平衡。与B+相比,它牺牲了部分读取性能来提高写入性能。 读取时候,因为我们不知道数据在哪棵树上,所以必须遍历所有的,但是每棵数据都是有序。 以上就是LSM最本质原理,有了原理,再看具体技术就很简单了: 关于lsm内存结构,可以是B+,还可以为跳跃表(skip-list)或是一个有序字符串表(SSTables)。

    1.2K20编辑于 2022-05-16
  • 来自专栏JMCui

    MySQL B+索引.

    一、B+索引概述 索引是应用程序设计和开发一个重要方面。若索引太多,应用程序性能可能会受到影响(需维护索引结构和数据);而索引太少,对查询性能又会产生影响。 B+ 是为磁盘或其他直接存取辅助设备设计一种平衡查找B+ B 不是代表二叉(binary),而是代表平衡(balance)。 B+ 索引本质就是 B+ 在数据库中实现,但是 B+ 索引在数据库中有一个特点是高扇出性(数据库分区),因此在数据库中,B+ 高度一般都在 2-4 层,这也就是说查找某一键值行记录时最多只需要 数据库中 B+ 索引可以分为 聚集索引和辅助索引。 B+ 索引并不能找到一个给定键值具体行。B+ 索引能找到只是被查找数据行所在页。 这是由当前传统机械硬盘特性所决定,即利用顺序读来替换随机读查找。可以使用关键字 FORCE INDEX 来强制使用某个索引。

    1.2K20发布于 2020-08-14
  • 来自专栏花落的技术专栏

    红黑、BB+

    现在假设搜索结果是最左边叶子节点 16,因为磁盘预读特性,加上一个页能存储 5 个节点,第一次 I/O : 第一次I/O 如上,第一次 I/O 就读取了 5 个节点,不仅把根节点读取进内存了,还把节点 B/B+索引数量 B 节点中存储:指针、关键字(主键)、数据 B+ 非叶子节点:指针、关键字 B+叶子节点:指针(链表)、关键字、数据 注意,这里不是绝对,比如有的 B+ 中叶子节点存储不是数据 而且上述是假设数据为 1KB,如果数据没那么大,高度为 3 B 能存储更多数据,但是如果用在大型数据库索引上还是不够。 B+ B+ 如上图,B+核心在于非叶子节点不存储数据。 高度为 3 B+ 进行两次 I/O 就可以索引千万级别的数据,高度为 4 B+ ,进行 3 次 I/O 就能索引十亿级别的数据量,这个效果还是很好。 B/B+优点 更适合磁盘存储,减少了层级,进而减少 I/O 次数; B B+ 对比 都是 B ,但是 B+更适合范围查询,比如 Mysql,且查询次数很稳定,为 logn。

    1.2K40发布于 2021-11-25
  • 来自专栏我的技术专刊

    红黑、BB+

    现在假设搜索结果是最左边叶子节点 16,因为磁盘预读特性,加上一个页能存储 5 个节点,第一次 I/O : 第一次I/O 如上,第一次 I/O 就读取了 5 个节点,不仅把根节点读取进内存了,还把节点 B/B+索引数量 B 节点中存储:指针、关键字(主键)、数据 B+ 非叶子节点:指针、关键字 B+叶子节点:指针(链表)、关键字、数据 注意,这里不是绝对,比如有的 B+ 中叶子节点存储不是数据 而且上述是假设数据为 1KB,如果数据没那么大,高度为 3 B 能存储更多数据,但是如果用在大型数据库索引上还是不够。 B+ B+ 如上图,B+核心在于非叶子节点不存储数据。 高度为 3 B+ 进行两次 I/O 就可以索引千万级别的数据,高度为 4 B+ ,进行 3 次 I/O 就能索引十亿级别的数据量,这个效果还是很好。 B/B+优点 更适合磁盘存储,减少了层级,进而减少 I/O 次数; B B+ 对比 都是 B ,但是 B+更适合范围查询,比如 Mysql,且查询次数很稳定,为 logn。

    94900编辑于 2021-12-05
  • 来自专栏乐行僧的博客

    B-B+,B*

    1.减少磁盘IO 2.更快搜索算法 操作系统中, 管理内存是按照页page 4K 管理 管理磁盘是按照block 16K 现在有n = 1000w个索引需要从磁盘中进行读取和搜索? avl和m为300B-? avl高度:log2n = 24层 最差情况一个节点只存储一个索引? 最差需要24次磁盘IO B-高度:log(300)n = 3 层 最多花费3次磁盘IO B+ B+是B-一种变形 非叶子结点只存储索引,不存储数据 B+叶子结点包含全部关键字信息 ,而B-数据分散在各个结点当中。 B+存放索引项相对于B-能够存储更多。 B* B*B+变体,在B+非根和叶子结点在增加指向兄弟结点指针 B*提高了结点利用率。

    1.4K30编辑于 2022-02-25
  • 来自专栏Java架构师必看

    BB+、B*——简单介绍

    BB+、B*——简单介绍 强烈推介IDEA2020.2破解激活,IntelliJ IDEA 注册码,2020.2 IDEA 激活码 一、为什么是有B ---- 二叉存在问题:二叉构建是在内存中执行,需要将磁盘中文件通过 IO操作进行读取。 【3】文件系统及数据库系统设计者利用磁盘预读(预先读取)原理,将一个节点大小设置为页<page:数据读取最小单位>大小(通常为4k),这样每个节点只需要一次 IO就能载入内存;B(B+)广泛应用于文件存储系统及数据库文件系统中 三、BB+、B* ---- 【1】B介绍:前面介绍2-3、2-3-4就是 B,在 MySql 中经常听说某种索引是基于 BB+,如下图: ? 【2】B+介绍:B+ 是B变体,也是一种多路搜索,如下图: ? 【3】B* 介绍:B* B+变体,在B+非根和非叶子节点增加了指向兄弟指针,如下图: ?

    1.5K20发布于 2021-04-30
  • BB+区别

    具体区别1、叶子节点B不存指针,B+存双向指针,方便范围查找2、B非叶子节点也存储数据,B+不存储数据3、B不会有冗余索引,是唯一B+会有冗余索引4、存放同样数据,B层级比B+要高 ,因为B+有冗余索引,所以相同层级叶子节点数据就会更多,(可以有更多分叉)索引:如果存在主键,主键索引就是聚集索引如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引。 如果表没有主键,或没有合适唯一索引,则InnoDB会自动生成一个rowid作为隐藏聚集索引。

    37110编辑于 2024-06-06
  • 来自专栏业余草

    图解B+插入过程

    B+ 在现代数据库中很常见,如果我们了解它,在工作中可能对性能优化会有更好帮助! 最近我一直在思考 B+ 高度是由什么决定。知道我了解了 B+ 插入过程,才有一种恍然大悟感觉! 网上一些资料杂乱无章,不同数据库可能还有对 B+ 有不同实现。但是万变不离其宗,B+ 定义,大致如下所示: ? 总结一下,B+ 有下面 5 个重要特点。 B+ 与 B 最大不同是内部结点不保存数据,只用于索引,所有数据(或者说记录)都保存在叶子结点中。 下面以一棵 5 阶 B+ 插入过程,5 阶 B+ 节点最少 2 个 key,最多 4 个 key。 1、当为空,插入 5。 ? 只有一个关键字,叫根节点或叶子节点都是一样。 通常,一棵 MySQL B+ 高为 3 的话,大约能存上亿条。高度太高的话,查询效率会大打折扣!

    7.6K20发布于 2019-07-11
  • 来自专栏JavaEE

    多叉 & B & B+ & B*

    二叉因为每个节点只能有两个子节点,所以数据一多构建出来高度会很高。所以就出现了多叉,顾名思义,每个节点可以有多个子节点,这样来降低高度。 3. 所以B就是一棵平衡、排序多叉。B相关说明如下: B阶:节点最多子节点个数叫做阶。 B+B+是B变体,和B区别就是,B+所有数据都存放在叶子节点。 B+所有的数据都存放在叶子节点链表中,且链表中数据也是有序; 非叶子节点中存放是索引,而不是要操作数据,每个非叶子节点都会存放叶子节点索引,也叫稀疏索引; B+要进行搜素时,从根节点开始 B+一般用于文件系统; 6. B*: B*又是B+变体,就是在B+基础上,在非根非叶子节点之间增加了指向兄弟节点指针。

    1.9K20发布于 2020-12-22
  • 来自专栏xingoo, 一个梦想做发明家的程序员

    B B- B+ B*

    B-搜索,从根结点开始,对结点内关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围儿子结点;重复,直到所对应儿子指针为空,或已经是叶子结点; B-特性:        M/2结点;删除结点时,需将两个不足M/2兄弟结点合并; B+        B+是B-变体,也是一种多路搜索:        1.其定义基本与B-同,除了:        2.非叶子结点子树指针与关键字个数相同 B+搜索与B-也基本相同,区别是B+只有达到叶子结点才命中(B-可以在 非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;     B+特性:        1.所有关键字都出现在叶子结点链表中 4.更适合文件索引系统; B*B+变体,在B+非根和非叶子结点再增加指向兄弟指针; ?    ;B+总是到叶子结点才命中; B*:在B+基础上,为非叶子结点也增加链表指针,将结点最低利用率从1/2提高到2/3;

    2.2K71发布于 2018-01-17
  • 来自专栏性能与架构

    mysql B+索引

    上图就是一棵B+,每个部分有3个主要概念:物理磁盘块、数据项(蓝色)、指针(红色) 如磁盘块1,包含数据项 17、35,包含指针 P1、P2、P3,P1指向小于17磁盘块,P2指向在17和35之间磁盘块 ,P3指向大于35磁盘块 真实数据存于叶子节点中,即 3、5、9、10、13、15、28、29、36、60、75、79、90、99 非叶子节点中并不存放真实数据项,只存放指引搜索方向数据项,如 17、35 并不真实存在于数据表中 B+查找过程 如果要查找数据项29 1. 在内存中用二分查找确定29在17和35之间,锁定磁盘块1P2指针,通过P2指向磁盘地址,把磁盘块3由磁盘加载到内存,发生第二次IO 3. 29在26和30之间,锁定磁盘块3P2指针,通过指针加载磁盘块 内存中做二分查找找到29,结束查询 总计三次IO,即可找到目标数据项 3层B+可以表示上百万数据,对查询性能提高是巨大

    1.1K80发布于 2018-04-02
  • 来自专栏社区的朋友们

    理解 B+ 算法

    B+ 特点是能够保持数据稳定有序,其插入与修改拥有较稳定对数时间复杂度。B+ 元素自底向上插入。 另外说明一点,B+B并不是代表二叉(Binary),而是代表平衡(Balance)。 对于m阶B+,m值越大,固定高度B+存放值就越多。 举个栗子:往下图3阶B+中依次插入关键字:10、21、68、65、85 首先查找10应插入叶节点(最左下角那一个),插入发现没有破坏B+性质,完毕。 B+内部结点并没有指向关键字具体信息指针。 而B+内部结点只需要1个盘块。当需要把内部结点读入内存中时候,B 就比B+多一次盘块查找时间(在磁盘中就是盘片旋转寻道时间)。

    3.1K00发布于 2017-10-20
领券